package tp.igl.View;


import java.util.ArrayList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.layout.HBox;
import tp.igl.Adresse;
import tp.igl.AdresseIP;
import tp.igl.Masque;
import tp.igl.Segment;

/**
 * <b>Cette class est utilisée pour recuperer une adresse depuis l'interface graphique,
 * elle n'accepte que les adresses numériques
 * </b>
 * Utilise l'API JAVAFX 2.0
 * @see SegmentField
 * @see Adresse
 * @see AdresseIP
 * @see Masque
 * @see Segment
 * @author Redouane
 */
public class AdresseField extends HBox{
    
    
    EventHandler<ActionEvent> onAction;
    /**
     *L'atrribut où l'adresse sera rangé 
     */
    protected Adresse adresse;
    
     /**
     *la liste des champs qui recupere chaque segment de l'adresse
     */
    private ArrayList<SegmentField> listeDesSegements = new ArrayList<>();
    /**
     *Constructeur AdressField
     * <p>
     *  A la construction ,il initialise l'adresse qui va recuperer les valeurs lu, 
     * ainsi il créera 4 SegementField qui vont recuperer les quatre octes de l'adresse.
     * </p>
     * @param adresse la référence de l'objet où l'adresse sera rangé
     */
    public AdresseField(Adresse adresse) {
        super(8);
        this.adresse=adresse;
        if(adresse!=null){
            Segment seg;
            for(int i=0;i<adresse.getAdresse().length ; i++)
            {
                seg=adresse.getAdresse()[i];
                listeDesSegements.add(new SegmentField(seg));
            }
            this.getChildren().addAll(listeDesSegements);
                
        }
    } 

    /**
     *Retourne l'adresse
     * @return l'adresse lu
     */
    public Adresse getAdresse() {
        return adresse;
    }
    
    

    /**
     *Met a jour la référence de l'objet qui reçoive la valeur lu
     * @param adresse la référence de l'objet qui reçoive les modifications
     */
    public void setAdresse(Adresse adresse) {
        this.adresse = adresse;
        
    }
    
    /**
     * Converte l'Adresse en une AdresseIP.
     * @return l'adresse IP qui correspond à l'adresse
     * @see AdresseIP
     */
    public AdresseIP toAdresseIP(){
        return new AdresseIP(this.listeDesSegements.get(0).getSegment(),this.listeDesSegements.get(1).getSegment(),this.listeDesSegements.get(2).getSegment(),this.listeDesSegements.get(3).getSegment());
    }
    /**
     * Converte l'Adresse en un Masque.
     * @return Le masque qui correspond à l'adresse
     * @see Masque
     */
    public Masque toMasque(){
        return new Masque(this.listeDesSegements.get(0).getSegment(),this.listeDesSegements.get(1).getSegment(),this.listeDesSegements.get(2).getSegment(),this.listeDesSegements.get(3).getSegment());
    }
    
    /**
     * Met a jour l'affichage de l'adresse avec celle envoyée en parametre.
     * @param adresse L'adresse qui sera affiché dans l' AdressField
     * @see AdresseField
     * @see Adresse
     */
    public void refreshFields(Adresse adresse){
           this.setListeDesSegements(this.getListeDesSegements());  
    }

    /**
     *Retourne la liste des segments de ce champ.
     * @return la liste des segments
     * @see SegmentField
     */
    public ArrayList<SegmentField> getListeDesSegements() {
        return listeDesSegements;
    }

    /**
     *Met a jour la liste  des segments.
     * @param listeDesSegements 
     */
    public void setListeDesSegements(ArrayList<SegmentField> listeDesSegements) {
        this.listeDesSegements = listeDesSegements;
        int i=0;
        for(SegmentField segField: listeDesSegements){
            this.listeDesSegements.get(i).setSegment(segField.getSegment());
            i++; 
        }
    }

    
    
    
    /**
     * Retourne l'ActionEvent associe a ce objet.
     * @return l'ActionEvent associe a ce objet
     */
    public EventHandler<ActionEvent> getOnAction(){
        return onAction;
    }
    
    /**
     * Executer l'Action si elle est déja  définit.
     */
    public  void fire(){
        if(this.onAction!=null)
            this.onAction.handle(new ActionEvent(this, this));
    }

    /**
     * Définir l'action a executé lorsque une evenment de type ActionEvents ce produit.
     * @param value L'action a executé.
     */
    public void setOnAction(EventHandler<ActionEvent> value){
        this.onAction=value;
    }
    /**
     * <p>
     * Retourne une chaine de caracteres de l'adresse lu convertie à une des bases suivantes:
     *  <ul>
     *      <li>2  : la base Binaire</li>
     *      <li>8  : la base Octal</li>
     *      <li>10 : la base Décimal</li>
     *      <li>16 : la base Hexdécimal</li>
     *  </ul>
     * </p>
     * @param base la base de convertion.
     * @return l'adresse a la base voulu.
     */
    public String toString(int base) {
        return adresse.toString(base);
    }
    
    @Override
    public String toString() {
        return adresse.toString();
    }
    
}
